// Bitwise operators

#include <iostream>

using namespace std;

void DisplayInt( unsigned char ch )
{
	cout << (unsigned int)ch << endl;
}

int main( void )
{
	unsigned char byte1 = 0;
	unsigned char byte2 = 0;
	unsigned char byte3 = 0;

	byte1 = 0x0; // 0
	DisplayInt( byte1 ); 
	byte1 = 0x01; // 1
	DisplayInt( byte1 ); 
	byte1 = 0x09; // 9
	DisplayInt( byte1 ); 
	byte1 = 0x0A; // 10
	DisplayInt( byte1 ); 
	byte1 = 0x0F; // 15
	DisplayInt( byte1 ); 
	byte1 = 0x10; // 16
	DisplayInt( byte1 ); 
	byte1 = 0x80; // 128
	DisplayInt( byte1 ); 
	byte1 = 0xF0; // 240
	DisplayInt( byte1 ); 
	byte1 = 0xFF; // 255
	DisplayInt( byte1 );


	byte1 = 0x80; // 128
	byte1 = 0xFF; // 255

	// Bitwise and &
	cout << (int)(byte1 & 0xF0) << endl;
	if ( byte1 & 0xF0 )
	{
		cout << "bit(s) is on";
	}
	else
	{
		cout << "bit(s) is off";
	}

	cout << endl;

	// Bitwise or |
	cout << (int)(0x07 | 0xF0) << endl;

	// bitwise xor
	cout << (int)(0x07 ^ 0x0b) << endl;

	// ~ negation
	byte2 = 0xff;
	cout << ( int)(byte2) << endl;
	byte2 = ~byte2;
	cout << ( unsigned int)(byte2) << endl;
	byte2 = ~byte2;
	cout << ( unsigned int)(byte2) << endl;

	// bit shifting
	byte3 = 5;
	DisplayInt( byte3 ); 
	byte3 = byte3 << 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 << 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 << 1;
	DisplayInt( byte3 ); 

	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 
	byte3 = byte3 >> 1;
	DisplayInt( byte3 ); 

	cout << endl;


}